.md 囉VuePress 有一個滿有趣的機制,我認為也是一個很有趣的特色,其實這系列剛開始的介紹篇就有提到過了,猜到我要說什麼了嗎?沒錯,就是...
.md 中使用 Vue 語法的不過究竟如何使用呢?
.vue 一樣有 <script> 與 <style> 區塊看到這個標題有沒有覺得奇怪呢?正常的 .vue 組件其實有三個區塊的,那 <template> 跑哪去了呢?
其實答案超單純的, 整個 .md 其實都是 <template> 的範圍喔!只要你有需要插入任何 HTML 的標籤或者 Vue 的模板語法,都可以直接寫在文件中,至於寫在文件的什麼位置,就看你希望在哪裡用到囉!
像是下面這樣,就會在兩段文字段落中插入一個放大鏡的 icon 囉:
## 約定大於配置
「約定大於配置」(convention over configuration),是一種軟體開發的設計模式,目的是在減少開發人員需要做的決定,既有簡單的好處,而又不失靈活性。
<v-icon>mdi-magnify</v-icon>
簡單來說就是:如果沒有特殊的需求,只要稍微了解一下專案的結構就可以開始專注於內容主題的創作。
可以直接這樣使用的前提是
<v-icon>組件的存放位置在theme/global-components,或是有用其他方式註冊組件。
範例中使用的
<v-icon>是Vuetify.js這個 UI 套件所提供的組件之一,已經將組件全域註冊所以可以直接使用。
<script> 與 <style> 區塊的擺放不過不同於模板語法可以隨處插入使用,我建議 <script> 與 <style> 還是放在檔案的結尾處比較好,能避免在單一檔案不小心重複設置好幾個區塊的狀況,而寫法就與在寫 Vue 組件類似:
<template>
<component v-if="dynamicComponent" :is="dynamicComponent"></component>
</template>
<script>
export default {
data() {
return {
dynamicComponent: null
}
},
mounted () {
import('./lib-that-access-window-on-import').then(module => {
this.dynamicComponent = module.default
})
}
}
</script>
<style lang="stylus">
.title
font-size: 20px
</style>
window因為這些處理的過程,都是透過 node.js 來進行的,還沒有真正的在瀏覽器上執行,所以編譯的 .md 或 .vue 都一樣,不要不小心用到 window 這類以瀏覽器執行時才有的 API 了。
所以如果遇到一個組件在運作時,會直接性的操作到瀏覽器 API 或 DOM ,那請先用 <ClientOnly> 的標籤包起來才可以喔,這樣這個組件就只會在瀏覽器中才運行了。
<ClientOnly>
<NonSSRFriendlyComponent/>
</ClientOnly>